﻿#include <QResizeEvent>
#include <QTextBrowser>
#include <QDebug>
#include <QLabel>
#include "khistorypopup.h"
#include "../../view/kdisplayview/kdisplayview.h"

// 构造函数：初始化窗口、遮罩、动画等
HistoryPopup::HistoryPopup(QWidget* parent)
    : QWidget(parent)//parenwidget是parent，也就是displayview
{
    setVisible(false);
    setAttribute(Qt::WA_StyledBackground);//启用样式表背景绘制
    setStyleSheet("background-color: white; border-top-left-radius: 12px; border-top-right-radius: 12px;");//这个我发现被滚动布局给覆盖了，留在这里是想请问老师有什么办法可以不被滚动布局覆盖吗

    createOverlay();//创建遮罩层
    createContent();

    //创建一个属性动画对象
    m_pAnimation = new QPropertyAnimation(this, "geometry", this);
    m_pAnimation->setDuration(250);
    m_pAnimation->setEasingCurve(QEasingCurve::OutCubic);

    // 动画结束后隐藏 popup 和遮罩
    connect(m_pAnimation, &QPropertyAnimation::finished, this, [this]() {
        if (!m_visible) {
            hide();
            m_pOverlay->hide();
        }
        });

    parentWidget()->installEventFilter(this);//监听拖动窗口事件


}

// 创建遮罩层以及点击退出历史栏
void HistoryPopup::createOverlay() {
    m_pOverlay = new QWidget(parentWidget());
    m_pOverlay->setStyleSheet("background-color: rgba(0, 0, 0, 50);");//灰色
    m_pOverlay->hide();//默认隐藏
    m_pOverlay->installEventFilter(this);//监听遮罩层点击事件
}

//创建内容显示区域（包含历史记录列表）
void HistoryPopup::createContent() {

    m_phistoryList = new QListWidget(this);
    m_phistoryList->setStyleSheet("QListWidget { border: none; background: white; }");
    m_phistoryList->setSpacing(6);
    m_phistoryList->setFrameShape(QFrame::NoFrame);
    //设置垂直布局，让list从上往下排列
    auto* layout = new QVBoxLayout(this);
    layout->setContentsMargins(12, 12, 12, 12);

    layout->addWidget(m_phistoryList);

    //顶部对齐，默认从最上面排列
    layout->setAlignment(Qt::AlignTop);
}



// 切换显示 / 隐藏
void HistoryPopup::toggle() {
    if (m_visible) 
        hideAnimated();
    else 
        showAnimated();
}


// 弹出窗口显示动画
void HistoryPopup::showAnimated() {
    auto* view = qobject_cast<DisplayView*>(parentWidget());
    if (!view) return;

    int startY = view->getButtonAreaTop();
    int h = parentWidget()->height() - startY;//相减算出应该覆盖的大小

    setGeometry(0, parentWidget()->height(), parentWidget()->width(), h);
    show();

//让灰色遮罩大小与整个主窗口一样大
    m_pOverlay->setGeometry(parentWidget()->rect());//主窗口的矩形范围
    m_pOverlay->show();
    m_pOverlay->raise();//让遮罩层显示在所有控件的上面
    this->raise();//显示在遮罩层上面

    m_pAnimation->setStartValue(geometry());
    m_pAnimation->setEndValue(QRect(0, startY, width(), h));
    m_pAnimation->start();

    m_visible = true;
}

// 窗口隐藏动画
void HistoryPopup::hideAnimated() {
    QRect startRect = geometry();
    QRect endRect(startRect.x(), parentWidget()->height(), startRect.width(), startRect.height());

    m_pAnimation->setStartValue(startRect);
    m_pAnimation->setEndValue(endRect);
    m_pAnimation->start();

    m_visible = false;
}


// 事件过滤器：点击遮罩、点击记录项、窗口缩放处理
bool HistoryPopup::eventFilter(QObject* obj, QEvent* event) {

    //点击遮罩层关闭历史界面
    if (obj == m_pOverlay && event->type() == QEvent::MouseButtonPress) {
        toggle(); return true;
    }
    //改变窗口大小关闭历史界面
    if (obj == parentWidget() && event->type() == QEvent::Resize) {
        if (m_visible) toggle();
        return false;
    }
    //点击历史记录实现自动填充
    if(event->type()==QEvent::MouseButtonPress)
    {
        QWidget* clicked = qobject_cast<QWidget*>(obj);
            // 获取表达式和结果
        if (clicked && clicked->property("process").isValid()) {
            QString process = clicked->property("process").toString();
            QString result = clicked->property("result").toString();

            QStack<QString> tokens = clicked->property("tokens").value<QStack<QString>>();

            auto* view = qobject_cast<DisplayView*>(parentWidget());

            if (view) {
                view->setProcessExpression(process);  
                view->setExpression(result);  
            }

            emit historyResultClicked(result);

            hideAnimated(); 
            return true;
        }
    }

    return QWidget::eventFilter(obj, event);
}


//添加一条历史记录项到列表（表达式与结果）
void HistoryPopup::addRecord(const QString& processExpression, const QString& resultExpression)
{
    // 如果结果是nan（无效结果），就不添加到历史记录
    if (resultExpression.compare("nan", Qt::CaseInsensitive) == 0) return;

    // 创建自定义 QWidget
    QWidget* itemWidget = new QWidget(this);
    QVBoxLayout* vbox = new QVBoxLayout(itemWidget);  
    vbox->setContentsMargins(4, 4, 4, 4); 
    vbox->setSpacing(2); 

    QLabel* exprLabel = new QLabel(processExpression, itemWidget);
    exprLabel->setStyleSheet("color: gray; font-size: 22px;");

    QLabel* resultLabel = new QLabel(resultExpression, itemWidget);
    resultLabel->setStyleSheet("color: black; font-size: 28px; font-weight: bold;");

    vbox->addWidget(exprLabel);
    vbox->addWidget(resultLabel);

    // 包裹 QWidget 成一个 QListWidgetItem
    QListWidgetItem* item = new QListWidgetItem();
    item->setSizeHint(QSize(0, 72));  // 控制高度
    m_phistoryList->insertItem(0, item);
    m_phistoryList->setItemWidget(item, itemWidget);

    // 设置数据属性（用于点击判断）
    itemWidget->setProperty("process", processExpression);
    itemWidget->setProperty("result", resultExpression);
    //监听点击事件
    itemWidget->installEventFilter(this);
}